﻿namespace BathroomLocator.Phone
{
	using System.Windows;
	using System.Windows.Navigation;
	using Microsoft.Phone.Controls;
	using Microsoft.Phone.Shell;

	public partial class App : Application
	{
		private static ICloudClientFactory cloudClientFactory = null;

		// Avoid double-initialization
		private bool phoneApplicationInitialized = false;

		/// <summary>
		/// Constructor for the Application object.
		/// </summary>
		public App()
		{
			// Global handler for uncaught exceptions. 
			UnhandledException += this.Application_UnhandledException;

			// Show graphics profiling information while debugging.
			if (System.Diagnostics.Debugger.IsAttached)
			{
				// Display the current frame rate counters.
				Application.Current.Host.Settings.EnableFrameRateCounter = true;

				// Show the areas of the app that are being redrawn in each frame.
				// Application.Current.Host.Settings.EnableRedrawRegions = true;

				// Enable non-production analysis visualization mode, 
				// which shows areas of a page that are being GPU accelerated with a colored overlay.
				// Application.Current.Host.Settings.EnableCacheVisualization = true;
			}

			// Standard Silverlight initialization
			this.InitializeComponent();

			// Phone-specific initialization
			this.InitializePhoneApplication();
		}

		public static ICloudClientFactory CloudClientFactory
		{
			get
			{
				if (cloudClientFactory == null)
				{
					cloudClientFactory = new CloudClientFactory();
				}

				return cloudClientFactory;
			}
		}

        public static string TablesEndpoint
        {
            get
            {
                return Application.Current.Resources["AzureStorageTableProxyEndpoint"].ToString();
            }
        }

		/// <summary>
		/// Provides easy access to the root frame of the Phone Application.
		/// </summary>
		/// <returns>The root frame of the Phone Application.</returns>
		public PhoneApplicationFrame RootFrame { get; private set; }

		// Code to execute when the application is launching (eg, from Start)
		// This code will not execute when the application is reactivated
		private void Application_Launching(object sender, LaunchingEventArgs e)
		{
		}

		// Code to execute when the application is activated (brought to foreground)
		// This code will not execute when the application is first launched
		private void Application_Activated(object sender, ActivatedEventArgs e)
		{
		}

		// Code to execute when the application is deactivated (sent to background)
		// This code will not execute when the application is closing
		private void Application_Deactivated(object sender, DeactivatedEventArgs e)
		{
		}

		// Code to execute when the application is closing (eg, user hit Back)
		// This code will not execute when the application is deactivated
		private void Application_Closing(object sender, ClosingEventArgs e)
		{
		}

		// Code to execute if a navigation fails
		private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
		{
			if (System.Diagnostics.Debugger.IsAttached)
			{
				// A navigation has failed; break into the debugger
				System.Diagnostics.Debugger.Break();
			}
		}

		// Code to execute on Unhandled Exceptions
		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
		{
			if (System.Diagnostics.Debugger.IsAttached)
			{
				// An unhandled exception has occurred; break into the debugger
				System.Diagnostics.Debugger.Break();
			}
		}

		#region Phone application initialization

		// Do not add any additional code to this method
		private void InitializePhoneApplication()
		{
			if (this.phoneApplicationInitialized)
			{
				return;
			}

			// Create the frame but don't set it as RootVisual yet; this allows the splash
			// screen to remain active until the application is ready to render.
			this.RootFrame = new PhoneApplicationFrame();
			this.RootFrame.Navigated += this.CompleteInitializePhoneApplication;

			// Handle navigation failures
			this.RootFrame.NavigationFailed += this.RootFrame_NavigationFailed;

			// Ensure we don't initialize again
			this.phoneApplicationInitialized = true;
		}

		// Do not add any additional code to this method
		private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
		{
			// Set the root visual to allow the application to render
			if (this.RootVisual != this.RootFrame)
			{
				this.RootVisual = this.RootFrame;
			}

			// Remove this handler since it is no longer needed
			this.RootFrame.Navigated -= this.CompleteInitializePhoneApplication;
		}

		#endregion
	}
}